home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-01
/
tty.zip
/
TTYIO.ASM
< prev
next >
Wrap
Assembly Source File
|
1992-03-11
|
17KB
|
1,276 lines
; Written by Chris Sokol
PUBLIC _TTYAvail
PUBLIC _TTYClose
PUBLIC _TTYDone
PUBLIC _TTYGet
PUBLIC _TTYInit
PUBLIC _TTYOpen
PUBLIC _TTYPut
PUBLIC _TTYTerm
TTY_TEXT SEGMENT PUBLIC 'CODE'
ASSUME cs:TTY_TEXT, ds:TTY_TEXT
INCLUDE ttyio.inc
Dummy DW 0 ; So OFFSET Handles[0] != 0
Handles TTYHand MAX_TTYS DUP (<>)
IrqPtrs TTYIrq 16 DUP (<>)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_TTYAvail:
push bp
mov bp, sp
push ds
push si
mov ax, cs
mov ds, ax
mov al, 6[bp]
call GetHand
jnc AvCheck
mov ax, ERRbhand
jmps AvExit
AvCheck:
mov ax, [si].THrxbuf.TBin
sub ax, [si].THrxbuf.TBout
jz AvExit
mov ax, 1
AvExit:
pop si
pop ds
pop bp
retf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_TTYClose:
push bp
mov bp, sp
push ds
push si
mov ax, cs
mov ds, ax
mov al, 6[bp]
call GetHand
jnc ClClose
mov ax, ERRbhand
jmps ClExit
ClClose:
call HandClose
call HandFree
xor ax, ax
ClExit:
pop si
pop ds
pop bp
retf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_TTYDone:
push bp
mov bp, sp
push ds
push si
mov ax, cs
mov ds, ax
mov al, 6[bp]
call GetHand
jnc DoCkDone
mov ax, ERRbhand
jmps DoExit
DoCkDone:
call [si].THselect
UAddr UALiSta
in al, dx
and al, 60h
cmp al, 60h
je DoDone
xor ax, ax
jmps DoExit
DoDone:
mov ax, 1
DoExit:
pop si
pop ds
pop bp
retf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_TTYGet:
push bp
mov bp, sp
push ds
push si
push di
mov ax, cs
mov ds, ax
mov al, 6[bp]
call GetHand
jnc GeCkData
mov ah, RXhinv
jmps GeExit
GeCkData:
mov bx, [si].THrxbuf.TBout
cmp bx, [si].THrxbuf.TBin
jne GeGet
mov ah, RXndat
jmps GeExit
GeGet:
les di, [si].THrxbuf.TBbuff
add di, bx
add di, bx
mov ax, es:[di]
inc bx
cmp bx, [si].THrxbuf.TBsize
jne GeNoWrap
xor bx, bx
GeNoWrap:
mov [si].THrxbuf.TBout, bx
GeExit:
pop di
pop si
pop ds
pop bp
retf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_TTYInit:
push di
mov ax, cs
mov es, ax
lea di, Handles
xor al, al
mov cx, MAX_TTYS * SIZE TTYHand
rep stosb
pop di
retf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_TTYOpen:
push bp
mov bp, sp
push ds
push si
mov ax, cs
mov ds, ax
call HandAlloc ; Allocate handle (AX=h, SI=buf)
jc OpExit ; If error C=1, AX=error
push ax ; Save handle
call HandOpen ; Init buf with params
jc OpHOErr ; If error C=1, AX=error
pop ax ; No error, restore handle and exit
jmps OpExit
OpHOErr:
pop bx ; Buf init error, discard handle
push ax ; Save error
call HandFree ; Free buf pointed to by SI
pop ax ; Restore error and exit
OpExit:
pop si
pop ds
pop bp
retf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_TTYPut:
push bp
mov bp, sp
push ds
push si
mov ax, cs
mov ds, ax
mov al, 6[bp]
call GetHand
jnc PuPut
mov ax, ERRbhand
jmps PuExit
PuPut:
call [si].THselect
mov ax, 8[bp]
call QueueOut
or ax, ax
jnz PuExit
call Resume
xor ax, ax
PuExit:
pop si
pop ds
pop bp
retf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_TTYTerm:
push si
xor si, si
TeLoop:
push si
call FAR PTR _TTYClose
pop ax
inc si
cmp si, MAX_TTYS
jne TeLoop
pop si
retf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; This is a block of 16 ISR entry points, one for each possible IRQ
IVecList:
IVEC_NO = 0
REPT 16
GenIVIdx %IVEC_NO
IVEC_NO = IVEC_NO + 1
ENDM
IVEC_NO = 0
REPT 16
GenIVec %IVEC_NO
IVEC_NO = IVEC_NO + 1
ENDM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DebugOut:
push es
push di
push ax
mov ax, 0b800h
mov es, ax
mov di, 001d8h
inc DebugCnt
mov ax, DebugCnt
call OutWord
DOexit:
pop ax
pop di
pop es
ret
DebugCnt DW 0
OutWord:
xchg al, ah
call OutByte
xchg al, ah
call OutByte
ret
OutByte:
push ax
shr al, 1
shr al, 1
shr al, 1
shr al, 1
call OutNybb
pop ax
call OutNybb
ret
OutNybb:
push ax
and al, 0fh
cmp al, 9
jbe ONok
add al, 7
ONok:
mov ah, 01fh
add al, 30h
mov es:[di], ax
inc di
inc di
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GetHand:
cmp al, MAX_TTYS
jae GHBadHand
lea si, Handles
mov ah, SIZE TTYHand
mul ah
add si, ax
test [si].THflags, THFopen
jz GHBadHand
clc
ret
GHBadHand:
stc
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HandAlloc:
lea si, Handles
xor ax, ax
mov cx, MAX_TTYS
HALoop:
test [si].THflags, THFopen
jz HAFound
add si, SIZE TTYHand
inc ax
loop HALoop
stc
jmps HAExit
HAFound:
or [si].THflags, THFopen
clc
HAExit:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HandClose:
call TermUART
call TermIRQ
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HandFree:
and [si].THflags, 0ffffh-THFopen
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HandOpen:
call HOInitVars
call HOInitParms
call InitIRQ
call InitUART
call TermUART
call InitUART
xor ax, ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Slctors DW SlctDummy
DW SlctV0
DW SlctV1
DW SlctV2
DW SlctV3
DW SlctV4
DW SlctV5
DW SlctV6
DW SlctV7
HOInitParms:
mov ax, 6[bp]
mov [si].THioaddr, ax
mov ax, 8[bp]
mov [si].THirqno, ax
mov bx, 10[bp]
shl bx, 1
mov ax, Slctors[bx]
mov [si].THselect, ax
mov ax, 12[bp]
mov WORD PTR [si].THrxbuf.TBbuff, ax
mov ax, 14[bp]
mov WORD PTR [si].THrxbuf.TBbuff+2, ax
mov ax, 16[bp]
mov [si].THrxbuf.TBsize, ax
mov ax, 18[bp]
mov WORD PTR [si].THtxbuf.TBbuff, ax
mov ax, 20[bp]
mov WORD PTR [si].THtxbuf.TBbuff+2, ax
mov ax, 22[bp]
mov [si].THtxbuf.TBsize, ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HOInitVars:
xor al, al
mov [si].THlins, al
mov [si].THmdms, al
mov al, LCWLen0+LCWLen1
mov [si].THlinc, al
mov al, MCDTR+MCOUT2
mov [si].THmdmc, al
xor ax, ax
mov [si].THrxbuf.TBin, ax
mov [si].THrxbuf.TBout, ax
xor ax, ax
mov [si].THtxbuf.TBin, ax
mov [si].THtxbuf.TBout, ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IHLSR:
UAddr UALiSta
in al, dx
cmp al, [si].THlins
je LSRsame
mov [si].THlins, al
mov ah, RXlins
call QueueIn
LSRsame:
jmp IHLoop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IHMSR:
UAddr UAMdSta
in al, dx
mov [si].THmdms, al
mov ah, RXmdms
call QueueIn
test [si].THflags, THFhfctl
jz MSRexit
test al, MSCTS
jz MSRwait
and [si].THflags, 0ffffh-THFhwait
call Resume
jmps MSRexit
MSRwait:
or [si].THflags, THFhwait
MSRexit:
IF DEBUG
xor ax, ax
call MSROut
ENDIF
jmp IHLoop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IHRxD:
UAddr UARxBuf
in al, dx
test [si].THflags, THFxfctl
jz RxDnxfctl
cmp al, 013h ; Ctrl-S
jne RxDnpause
or [si].THflags, THFxwait
jmp IHLoop
RxDnpause:
cmp al, 011h ; Ctrl-Q
jne RxDnxfctl
and [si].THflags, 0ffffh-THFxwait
call Resume
jmp IHLoop
RxDnxfctl:
mov ah, RXchar
call QueueIn
jmp IHLoop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IHTxD:
and [si].THflags, 0ffffh-THFxmit
call Resume
jmp IHLoop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Init8259:
mov bl, 1
mov cl, BYTE PTR [si].THirqno
mov dx, MOCW1
cmp cl, 8
jb I82baseok
sub cl, 8
mov dx, SOCW1
I82baseok:
shl bl, cl
xor bl, 0ffh
in al, dx
and al, bl
out dx, al
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
InitIRQ:
push di
mov al, BYTE PTR [si].THirqno
mov ah, SIZE TTYIrq
mul ah
lea di, IrqPtrs
add di, ax
mov ax, [di].TItail
mov [si].THprvirq, ax
xor ax, ax
mov [si].THnxtirq, ax
mov bx, [di].TItail
or bx, bx
jz IIRQfirst
mov [bx].THnxtirq, si
jmps IIRQadded
IIRQfirst:
mov [di].TIhead, si
IIRQadded:
mov [di].TItail, si
or bx, bx
jnz IIRQnfirst
call InitIVec
call Init8259
IIRQnfirst:
pop di
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
InitIVec:
push di ; DI = &TTYIrq
xor ax, ax
mov es, ax
mov bx, [si].THirqno
cmp bl, 8
jb IIVmast
mov di, 68h
jmps IIVgetvec
IIVmast:
mov di, 08h
IIVgetvec:
add di, bx
shl di, 1
shl di, 1
shl bx, 1
mov ax, WORD PTR IVecList[bx]
mov bx, cs
cli
xchg ax, es:[di]
xchg bx, es:[di+2]
pop di ; restore &TTYIrq
mov WORD PTR [di].TIoldvec, ax
mov WORD PTR [di].TIoldvec+2, bx
sti
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
InitUART:
call [si].THselect
UAddr UAIntEn
xor al, al
out dx, al
UAddr UALiCtl
mov al, [si].THlinc
out dx, al
UAddr UAMdCtl
mov al, [si].THmdmc
out dx, al
UAddr UARxBuf
in al, dx
UAddr UALiSta
in al, dx
UAddr UAMdSta
in al, dx
UAddr UAIntEn
mov al, 0fh
out dx, al
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UARTInts DW IHMSR
DW IHTxD
DW IHRxD
DW IHLSR
IntHand:
push ds
push es
push di
push ax
push bx
push cx
push dx
mov ax, cs
mov ds, ax
mov si, [si].TIhead
IHLoop:
call [si].THselect
UAddr UAIntId
in al, dx
test al, 01h
jnz IHnext
xor bh, bh
mov bl, al
jmp UARTInts[bx]
IHnext:
test [si].THnxtirq, 0ffffh
jz IHexit
mov si, [si].THnxtirq
jmps IHLoop
IHexit:
mov al, 20h
cmp [si].THirqno, 8
jb IHmaster
out SOCW2, al
IHmaster:
out MOCW2, al
pop dx
pop cx
pop bx
pop ax
pop di
pop es
pop ds
pop si
iret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MSROut:
push di
mov bx, 0b800h
mov es, bx
mov di, 00094h
add di, ax
mov ah, 80h
mov al, [si].THmdms
xor bx, bx
MSROloop:
mov cl, MSRChars[bx]
test al, ah
jnz MSROhigh
or cl, 20h
MSROhigh:
mov es:[di], cl
mov BYTE PTR es:[di+1], 01fh
inc di
inc di
shr ah, 1
inc bx
cmp bx, 4
jne MSROloop
mov al, '-'
test [si].THflags, THFhwait
jz MSROhout
mov al, '+'
MSROhout:
mov es:[di], al
mov BYTE PTR es:[di+1], 01fh
inc di
inc di
mov al, '-'
test [si].THflags, THFxwait
jz MSROxout
mov al, '+'
MSROxout:
mov es:[di], al
mov BYTE PTR es:[di+1], 01fh
pop di
ret
MSRChars DB 'QRDC'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OutBaud:
xor bh, bh
mov bl, al
shl bx, 1
UAddr UALiCtl
mov al, [si].THlinc
or al, LCDLAB
out dx, al
mov ax, BaudTab[bx]
UAddr UADvLsb
out dx, al
UAddr UADvMsb
mov al, ah
out dx, al
UAddr UALiCtl
mov al, [si].THlinc
out dx, al
ret
BaudTab DW 384
DW 96
DW 48
DW 24
DW 12
DW 6
DW 3
DW 2
DW 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OutChar:
or [si].THflags, THFxmit
UAddr UATxBuf
out dx, al
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OutLinC:
mov [si].THlinc, al
UAddr UALiCtl
out dx, al
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OutMdmC:
mov [si].THmdmc, al
UAddr UAMdCtl
out dx, al
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OutProc:
IF DEBUG
call DebugOut
ENDIF
cmp ah, TXchar
je OPchar
cmp ah, TXbaud
je OPbaud
cmp ah, TXhwfc
je OPhwfc
cmp ah, TXlinc
je OPlinc
cmp ah, TXmdmc
je OPmdmc
cmp ah, TXxofc
je OPxofc
ret
OPbaud:
jmp OutBaud
OPchar:
jmp OutChar
OPlinc:
jmp OutLinC
OPmdmc:
jmp OutMdmC
OPhwfc:
or al, al
jz OPhdis
or [si].THflags, THFhfctl
and [si].THflags, 0ffffh-THFhwait
ret
OPhdis:
and [si].THflags, 0ffffh-THFhfctl
ret
OPxofc:
or al, al
jz OPxdis
or [si].THflags, THFxfctl
and [si].THflags, 0ffffh-THFxwait
ret
OPxdis:
and [si].THflags, 0ffffh-THFxfctl
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QueueIn:
push di
les di, [si].THrxbuf.TBbuff
mov bx, [si].THrxbuf.TBin
add di, bx
add di, bx
inc bx
cmp bx, [si].THrxbuf.TBsize
jne QINoWrap
xor bx, bx
QINoWrap:
cmp bx, [si].THrxbuf.TBout
je QIExit
mov es:[di], ax
mov [si].THrxbuf.TBin, bx
QIExit:
pop di
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QueueOut:
push di
les di, [si].THtxbuf.TBbuff
mov bx, [si].THtxbuf.TBin
add di, bx
add di, bx
inc bx
cmp bx, [si].THtxbuf.TBsize
jne QONoWrap
xor bx, bx
QONoWrap:
cmp bx, [si].THtxbuf.TBout
je QOFull
mov es:[di], ax
mov [si].THtxbuf.TBin, bx
xor ax, ax
jmps QOExit
QOFull:
mov ax, ERRqfull
QOExit:
pop di
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Resume:
pushf
IF DEBUG
mov ax, 000a0h
call MSROut
ENDIF
cli
test [si].THflags, THFxmit+THFhwait+THFxwait
jnz ReExit
ReLoop:
mov bx, [si].THtxbuf.TBout
cmp bx, [si].THtxbuf.TBin
je ReExit
les di, [si].THtxbuf.TBbuff
add di, bx
add di, bx
inc bx
cmp bx, [si].THtxbuf.TBsize
jne ReNoWrap
xor bx, bx
ReNoWrap:
mov [si].THtxbuf.TBout, bx
mov ax, es:[di]
call OutProc
test [si].THflags, THFxmit
jz ReLoop
ReExit:
popf
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SlctDummy:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SlctV0:
xor al, al
UAddr UAHCR
out dx, al
ret
SlctV1:
mov al, 1
UAddr UAHCR
out dx, al
ret
SlctV2:
mov al, 2
UAddr UAHCR
out dx, al
ret
SlctV3:
mov al, 3
UAddr UAHCR
out dx, al
ret
SlctV4:
mov al, 4
UAddr UAHCR
out dx, al
ret
SlctV5:
mov al, 5
UAddr UAHCR
out dx, al
ret
SlctV6:
mov al, 6
UAddr UAHCR
out dx, al
ret
SlctV7:
mov al, 7
UAddr UAHCR
out dx, al
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Term8259:
mov bl, 1
mov cl, BYTE PTR [si].THirqno
mov dx, MOCW1
cmp cl, 8
jb T82baseok
sub cl, 8
mov dx, SOCW1
T82baseok:
shl bl, cl
in al, dx
or al, bl
out dx, al
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TermIRQ:
push di
mov al, BYTE PTR [si].THirqno
mov ah, SIZE TTYIrq
mul ah
lea di, IrqPtrs
add di, ax
mov ax, [si].THnxtirq
mov bx, [si].THprvirq
or bx, ax
jz TIRQnprv
mov [bx].THnxtirq, ax
jmps TIRQlnxt
TIRQnprv:
mov [di].TIhead, ax
TIRQlnxt:
mov ax, [si].THprvirq
mov bx, [si].THnxtirq
or bx, bx
jz TIRQnnxt
mov [bx].THprvirq, ax
jmps TIRQunlnkd
TIRQnnxt:
mov [di].TItail, ax
TIRQunlnkd:
mov ax, [di].TIhead
and ax, [di].TItail ; if list is empty, then AX=0ffffh
inc ax
jnz TIRQnlast ; if inc != 0, then not empty
call Term8259
call TermIVec
TIRQnlast:
pop di
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TermIVec:
push di ; DI = &TTYIrq
xor ax, ax
mov es, ax
mov ax, WORD PTR [di].TIoldvec
mov bx, WORD PTR [di].TIoldvec+2
mov di, [si].THirqno
add di, 8
shl di, 1
shl di, 1
cli
mov es:[di], ax
mov es:[di+2], bx
sti
pop di
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TermUART:
call [si].THselect
xor al, al
UAddr UAIntEn
out dx, al
UAddr UAMdCtl
out dx, al
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TTY_TEXT ENDS
END